package com.ruoyi.system.service.impl;

import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.BlogUserMapper;
import com.ruoyi.system.domain.BlogUser;
import com.ruoyi.system.service.IBlogUserService;

/**
 * 博客用户Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
@Service
public class BlogUserServiceImpl implements IBlogUserService 
{
    @Autowired
    private BlogUserMapper blogUserMapper;

    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    /**
     * 查询博客用户
     * 
     * @param userId 博客用户主键
     * @return 博客用户
     */
    @Override
    public BlogUser selectBlogUserByUserId(Long userId)
    {
        return blogUserMapper.selectBlogUserByUserId(userId);
    }

    /**
     * 根据用户名查询博客用户
     * 
     * @param username 用户名
     * @return 博客用户
     */
    @Override
    public BlogUser selectBlogUserByUsername(String username)
    {
        return blogUserMapper.selectBlogUserByUsername(username);
    }

    /**
     * 根据邮箱查询博客用户
     * 
     * @param email 邮箱
     * @return 博客用户
     */
    @Override
    public BlogUser selectBlogUserByEmail(String email)
    {
        return blogUserMapper.selectBlogUserByEmail(email);
    }

    /**
     * 查询博客用户列表
     * 
     * @param blogUser 博客用户
     * @return 博客用户
     */
    @Override
    public List<BlogUser> selectBlogUserList(BlogUser blogUser)
    {
        return blogUserMapper.selectBlogUserList(blogUser);
    }

    /**
     * 新增博客用户
     * 
     * @param blogUser 博客用户
     * @return 结果
     */
    @Override
    public int insertBlogUser(BlogUser blogUser)
    {
        blogUser.setCreateTime(DateUtils.getNowDate());
        return blogUserMapper.insertBlogUser(blogUser);
    }

    /**
     * 修改博客用户
     * 
     * @param blogUser 博客用户
     * @return 结果
     */
    @Override
    public int updateBlogUser(BlogUser blogUser)
    {
        blogUser.setUpdateTime(DateUtils.getNowDate());
        return blogUserMapper.updateBlogUser(blogUser);
    }

    /**
     * 批量删除博客用户
     * 
     * @param userIds 需要删除的博客用户主键
     * @return 结果
     */
    @Override
    public int deleteBlogUserByUserIds(Long[] userIds)
    {
        return blogUserMapper.deleteBlogUserByUserIds(userIds);
    }

    /**
     * 删除博客用户信息
     * 
     * @param userId 博客用户主键
     * @return 结果
     */
    @Override
    public int deleteBlogUserByUserId(Long userId)
    {
        return blogUserMapper.deleteBlogUserByUserId(userId);
    }

    /**
     * 校验用户名称是否唯一
     * 
     * @param username 用户名称
     * @return 结果
     */
    @Override
    public boolean checkUsernameUnique(String username)
    {
        int count = blogUserMapper.checkUsernameUnique(username);
        return count == 0;
    }

    /**
     * 校验邮箱是否唯一
     * 
     * @param email 邮箱
     * @return 结果
     */
    @Override
    public boolean checkEmailUnique(String email)
    {
        int count = blogUserMapper.checkEmailUnique(email);
        return count == 0;
    }

    /**
     * 用户注册
     * 
     * @param blogUser 用户信息
     * @return 结果
     */
    @Override
    public int registerUser(BlogUser blogUser)
    {
        // 设置默认值
        blogUser.setStatus("0"); // 正常状态
        blogUser.setGender("0"); // 未知性别
        blogUser.setCreateTime(DateUtils.getNowDate());
        
        // 如果没有设置昵称，使用用户名作为昵称
        if (StringUtils.isEmpty(blogUser.getNickname()))
        {
            blogUser.setNickname(blogUser.getUsername());
        }
        
        // 加密密码
        String encryptedPassword = passwordEncoder.encode(blogUser.getPassword());
        blogUser.setPassword(encryptedPassword);
        
        return blogUserMapper.insertBlogUser(blogUser);
    }

    /**
     * 用户登录
     * 
     * @param username 用户名
     * @param password 密码
     * @return 用户信息
     */
    @Override
    public BlogUser login(String username, String password)
    {
        BlogUser user = blogUserMapper.selectBlogUserByUsername(username);
        if (user != null && "0".equals(user.getStatus()))
        {
            // 验证密码
            if (passwordEncoder.matches(password, user.getPassword()))
            {
                // 清空密码字段
                user.setPassword(null);
                return user;
            }
        }
        return null;
    }

    /**
     * 更新用户登录信息
     * 
     * @param blogUser 用户信息
     * @return 结果
     */
    @Override
    public int updateUserLoginInfo(BlogUser blogUser)
    {
        return blogUserMapper.updateUserLoginInfo(blogUser);
    }

    /**
     * 修改用户密码
     * 
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 结果
     */
    @Override
    public int updateUserPassword(Long userId, String oldPassword, String newPassword)
    {
        BlogUser user = blogUserMapper.selectBlogUserByUserId(userId);
        if (user != null && passwordEncoder.matches(oldPassword, user.getPassword()))
        {
            user.setPassword(passwordEncoder.encode(newPassword));
            user.setUpdateTime(DateUtils.getNowDate());
            return blogUserMapper.updateBlogUser(user);
        }
        return 0;
    }

    /**
     * 重置用户密码
     * 
     * @param email 邮箱
     * @param newPassword 新密码
     * @return 结果
     */
    @Override
    public int resetPassword(String email, String newPassword)
    {
        BlogUser user = blogUserMapper.selectBlogUserByEmail(email);
        if (user != null)
        {
            user.setPassword(passwordEncoder.encode(newPassword));
            user.setUpdateTime(DateUtils.getNowDate());
            return blogUserMapper.updateBlogUser(user);
        }
        return 0;
    }
}